home *** CD-ROM | disk | FTP | other *** search
/ Aminet 45 / Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso / Aminet / util / misc / ReportPlus.lha / reportplus / source / f1.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-08-20  |  64.7 KB  |  2,058 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <proto/exec.h>
  4. #include <intuition/intuition.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <proto/intuition.h>
  7. #include <libraries/gadtools.h>
  8. #include <proto/gadtools.h>
  9. #include <dos/dos.h>
  10. #include <proto/dos.h>
  11. #include <graphics/gfx.h>
  12. #include <clib/graphics_protos.h>
  13.  
  14. #include <clib/alib_protos.h>
  15. #include <ctype.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "rp.h"
  19.  
  20. #define SUBSYSTEMS 127
  21. #define CPUS         6
  22. #define MODELS      13
  23.  
  24. MODULE void refreshpv(void);
  25. MODULE void updatereportgadgets(void);
  26. MODULE void readreportgadgets(void);
  27.  
  28. AGLOBAL struct ReportStruct report;
  29.  
  30. MODULE ABOOL           SubsystemNodes          = FALSE;
  31. MODULE struct List     SubsystemList;
  32. MODULE struct Gadget  *CY11_Type               = NULL,
  33.                       *ST11_Summary            = NULL,
  34.                       *BU11_PathnameASL        = NULL,
  35.                       *LV11_Subsystem          = NULL,
  36.                       *CY11_Severity           = NULL,
  37.                       *ST11_Debug              = NULL,
  38.                       *ST11_KS                 = NULL,
  39.                       *ST11_WB                 = NULL,
  40.                       *ST11_Pathname           = NULL,
  41.                       *ST11_Version            = NULL,
  42.                       *TE11_3rdLabel           = NULL,
  43.                       *ST11_3rdName            = NULL,
  44.                       *ST11_3rdVer             = NULL,
  45.                       *ST11_3rdManuf           = NULL,
  46.                       *BU11_Sender             = NULL,
  47.                       *BU11_Config             = NULL,
  48.                       *TE11_EMailTo            = NULL,
  49.                       *ST12_Company            = NULL,
  50.                       *ST12_Developer          = NULL,
  51.                       *ST12_EMail              = NULL,
  52.                       *ST12_FirstName          = NULL,
  53.                       *ST12_LastName           = NULL,
  54.                       *ST12_Phone              = NULL,
  55.                       *MX13_Model              = NULL,
  56.                       *TE13_ModelText          = NULL,
  57.                       *MX13_Agnus              = NULL,
  58.                       *TE13_AgnusText          = NULL,
  59.                       *MX13_CPU                = NULL,
  60.                       *TE13_CPUText            = NULL,
  61.                       *MX13_Denise             = NULL,
  62.                       *TE13_DeniseText         = NULL,
  63.                       *IN13_Floppies           = NULL,
  64.                       *ST13_Chip               = NULL,
  65.                       *TE13_ChipText           = NULL,
  66.                       *ST13_Fast               = NULL,
  67.                       *TE13_FastText           = NULL,
  68.                       *ST13_Hard               = NULL,
  69.                       *ST13_Expansion          = NULL;
  70. MODULE struct
  71. {   STRPTR friendly;
  72.     STRPTR unfriendly;
  73. } subsystems[SUBSYSTEMS + 1] =
  74. {   {"3D Look",                "new.look"        },
  75.     {"A590",                   "A2091.A590"      },
  76.     {"A2013",                  "A2013"           },
  77.     {"A2065",                  "A2065"           },
  78.     {"A2090",                  "A2090.A2090A"    },
  79.     {"A2090A",                 "A2090.A2090A"    },
  80.     {"A2091",                  "A2091"           },
  81.     {"A2232",                  "A2232"           },
  82.     {"A2300",                  "A2300"           },
  83.     {"A2410",                  "A2410"           },
  84.     {"A2620",                  "A2620"           },
  85.     {"A2630",                  "A2630"           },
  86.     {"A3000",                  "A3000"           },
  87.     {"A4091",                  "A4091"           },
  88.     {"AmigaBASIC",             "AmigaBasic"      },
  89.     {"AGA chipset",            "aa.chips"        },
  90.     {"ALink",                  "alink"           },
  91.     {"amiga.lib",              "amiga.lib"       },
  92.     {"AmigaGuide",             "amigaguide"      },
  93.     {"AmigaTerm",              "amigaterm"       },
  94.     {"AmigaVision",            "amigavision"     },
  95.     {"AppShell",               "appshell"        },
  96.     {"ARexx",                  "arexx"           },
  97.     {"Art",                    "art"             },
  98.     {"AS225",                  "as225"           },
  99.     {"ASL.library",            "asl.library"     },
  100.     {"audio.device",           "audio.device"    },
  101.     {"AUTOCONFIG",             "autoconfig"      },
  102.     {"Battery-backed clock",   "battclock"       },
  103.     {"Battery-backed memory",  "battmem"         },
  104.     {"Bootstrap",              "strap"           },
  105.     {"BridgeBoard",            "bridgeboard"     },
  106.     {"BRU",                    "bru"             },
  107.     {"bullet.library",         "bullet"          },
  108.     {"C: programs",            "cdos.command"    },
  109.     {"CD.device",              "cd.device"       },
  110.     {"CD32 hardware",          "cdgs"            },
  111.     {"CDFileSystem",           "cdfilesystem"    },
  112.     {"CDTV",                   "cdtv"            },
  113.     {"CDTV.device",            "cdtv.device"     },
  114.     {"cdui",                   "cdui"            },
  115.     {"CIA.resource",           "cia.resource"    },
  116.     {"CLI",                    "shell"           },
  117.     {"clipboard.device",       "clipboard"       },
  118.     {"Commodities",            "commodities"     },
  119.     {"CON-Handler",            "con-handler"     },
  120.     {"console.device",         "console.device"  },
  121.     {"Custom chipset",         "custom.chips"    },
  122.     {"Datatypes",              "datatypes"       },
  123.     {"debug.lib",              "debug.lib"       },
  124.     {"Developer support",      "devsupport"      },
  125.     {"disk.resource",          "disk.resource"   },
  126.     {"diskfont.library",       "diskfont"        },
  127.     {"DOS.library",            "dos.library"     },
  128.     {"Early Startup Control",  "bootmenu"        },
  129.     {"Envoy",                  "envoy"           },
  130.     {"Exec.library",           "exec"            },
  131.     {"expansion.library",      "expansion"       },
  132.     {"filesystem",             "filesystem"      },
  133.     {"filesystem.resource",    "filesysres"      },
  134.     {"Fonts",                  "fonts"           },
  135.     {"Fountain",               "fountain"        },
  136.     {"gadget.classes",         "gadget.classes"  },
  137.     {"GadTools.library",       "gadtools"        },
  138.     {"gameport.device",        "gameport"        },
  139.     {"Genlock",                "genlock"         },
  140.     {"Graphics",               "graphics"        },
  141.     {"Hardware",               "hardware"        },
  142.     {"HDBackup",               "hdbackup"        },
  143.     {"HDToolBox",              "hdtoolbox"       },
  144.     {"icon.library",           "icon.library"    },
  145.     {"IconEdit",               "iconedit"        },
  146.     {"IDE.device",             "ide.device"      },
  147.     {"IFFParse.library",       "iffparse"        },
  148.     {"input.device",           "input.device"    },
  149.     {"Installer",              "installer"       },
  150.     {"IntelliFont",            "fountain"        },
  151.     {"Intuition.library",      "intuition"       },
  152.     {"IPrefs",                 "iprefs"          },
  153.     {"Keyboard",               "keyboard"        },
  154.     {"keymap.library",         "keymap"          },
  155.     {"Keymaps",                "keymaps"         },
  156.     {"layers.library",         "layers"          },
  157.     {"locale.library",         "locale.library"  },
  158.     {"lowlevel.library",       "lowlevel"        },
  159.     {"Maths: FFP",             "mathffp"         },
  160.     {"Maths: IEEE Double Precision", "mathieeedoub"    },
  161.     {"Maths: IEEE Single Precision", "mathieeesing"    },
  162.     {"Maths: IEEE",            "mathieee"        },
  163.     {"MicroEMACS",             "microemacs"      },
  164.     {"Monitors",               "monitors"        },
  165.     {"MultiView",              "multiview"       },
  166.     {"nonvolatile",            "nonvolatile"     },
  167.     {"parallel.device",        "parallel.device" },
  168.     {"PCMCIA",                 "creditcard"      },
  169.     {"PORT-Handler",           "port-handler"    },
  170.     {"potgo.resource",         "potgo.resource"  },
  171.     {"Preferences",            "preferences"     },
  172.     {"Printer drivers",        "printer.driver"  },
  173.     {"printer.device",         "printer.device"  },
  174.     {"QUEUE-Handler",          "queue-handler"   },
  175.     {"RAM-Handler",            "ram-handler"     },
  176.     {"ramlib",                 "ramlib"          },
  177.     {"realtime",               "realtime"        },
  178.     {"Report+",                "report+"         },
  179.     {"Resources",              "resource"        },
  180.     {"ROM Kernel Manuals",     "rkm"             },
  181.     {"ROMWack",                "wack"            },
  182.     {"SANA-2",                 "sana2"           },
  183.     {"Scripts",                "script"          },
  184.     {"SCSI.device",            "scsi.device"     },
  185.     {"serial.device",          "serial.device"   },
  186.     {"Shell",                  "shell"           },
  187.     {"Startup",                "startup"         },
  188.     {"System/ programs",       "system.command"  },
  189.     {"TCP/IP",                 "as225"           },
  190.     {"timer.device",           "timer.device"    },
  191.     {"ToolMaker",              "toolmaker"       },
  192.     {"Tools/ programs",        "tools"           },
  193.     {"trackdisk.device",       "trackdisk"       },
  194.     {"UNIX",                   "unix"            },
  195.     {"Unsure",                 ""                },
  196.     {"User manuals",           "userdocs"        },
  197.     {"Utilities/ programs",    "util.command"    },
  198.     {"utility.library",        "utility.library" },
  199.     {"Wack",                   "wack"            },
  200.     {"Workbench",              "workbench"       },
  201.     {"Worm Wars",              "wormwars"        }
  202. };
  203. MODULE STRPTR TypeOptions[4] =
  204. {   "System Software/Hardware Bug",
  205.     "3rd Party Product Compatibility",
  206.     "Enhancement Request",
  207.     NULL
  208. };
  209. MODULE STRPTR SeverityOptions[5] =
  210. {   (STRPTR) "Crashes, hangs or corrupts data",
  211.     (STRPTR) "Behaves incorrectly",
  212.     (STRPTR) "Cosmetic problem",
  213.     (STRPTR) "Works correctly",
  214.     NULL
  215. };
  216. MODULE STRPTR AgnusOptions[6] =
  217. {   (STRPTR) "AGA",
  218.     (STRPTR) "ECS PAL",
  219.     (STRPTR) "ECS NTSC",
  220.     (STRPTR) "OCS PAL",
  221.     (STRPTR) "OCS NTSC",
  222.     NULL
  223. };
  224. MODULE STRPTR DeniseOptions[4] =
  225. {   (STRPTR) "AGA",
  226.     (STRPTR) "ECS",
  227.     (STRPTR) "OCS",
  228.     NULL
  229. };
  230. MODULE STRPTR CPUOptions[CPUS + 2] =
  231. {   (STRPTR) "68000",
  232.     (STRPTR) "68010",
  233.     (STRPTR) "68020",
  234.     (STRPTR) "68030",
  235.     (STRPTR) "68040",
  236.     (STRPTR) "68060",
  237.     (STRPTR) "PowerPC",
  238.     NULL
  239. };
  240. MODULE STRPTR ModelOptions[MODELS + 2] =
  241. {   (STRPTR) "A500",
  242.     (STRPTR) "A500+",
  243.     (STRPTR) "A600",
  244.     (STRPTR) "A1000",
  245.     (STRPTR) "A1200",
  246.     (STRPTR) "A1500",
  247.     (STRPTR) "A2000",
  248.     (STRPTR) "A2500",
  249.     (STRPTR) "A3000",
  250.     (STRPTR) "A4000",
  251.     (STRPTR) "CDTV",
  252.     (STRPTR) "CD32",
  253.     (STRPTR) "DraCo",
  254.     (STRPTR) "Emulator",
  255.     NULL
  256. };
  257.  
  258. IMPORT ULONG               offset;
  259. IMPORT TEXT                aslresult[MEDFIELD + 1];
  260. IMPORT TEXT                weekdaystring[10],
  261.                            datestring[10],
  262.                            timestring[9];
  263. IMPORT struct SharedStruct shared;
  264. IMPORT struct NewGadget    Gadget;
  265. IMPORT struct Gadget      *BU99_Right,
  266.                           *BU99_TextEditor,
  267.                           *GListPtr,
  268.                           *PrevGadPtr;
  269. IMPORT TEXT                IOBuffer[LONGESTFIELD + 1];
  270. IMPORT SBYTE               page;
  271. IMPORT ABOOL               certified, fillwindows;
  272. IMPORT TEXT                string[VLONGFIELD + 1];
  273. IMPORT struct Window*      MainWindowPtr;
  274.  
  275. /* report.textfield[] are:
  276.    0: brief bug description
  277.    1: bug generation procedure or example
  278.    2: if this works differently on other versions or hardware, explain
  279.    3: what developer is doing in that area of HW or SW
  280.    4: related problems
  281.    5: enhancement request */
  282.  
  283. AGLOBAL void report1(void)
  284. {  /* PAGE 11 ************************************************************ */
  285.  
  286.     verynewwindow
  287.     (   REPORTWIDTH, REPORTHEIGHT,
  288.         "Report+: Report Details",
  289.         BUTTONIDCMP | LISTVIEWIDCMP | STRINGIDCMP | CYCLEIDCMP
  290.     );
  291.     if (fillwindows)
  292.     {   SetAPen(MainWindowPtr->RPort, 0);
  293.         RectFill(MainWindowPtr->RPort,  10, 144,  10 + 238, 144 + 87 - 4); // LV11_Subsystem
  294.         RectFill(MainWindowPtr->RPort, 182,  32, 182 + 312,  32 + 12);     // TE11_EMailTo
  295.     }
  296.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_NEW,    NOSUB));
  297.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_OPEN,   NOSUB));
  298.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  299.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  300.  
  301.     /* summary */
  302.     setgadget(182, 20, 448, 12, "_Summary:", PLACETEXT_LEFT);
  303.     ST11_Summary = PrevGadPtr = (struct Gadget *) CreateGadget
  304.     (   STRING_KIND,
  305.         PrevGadPtr,
  306.         &Gadget,
  307.         STRINGA_Justification, GACT_STRINGLEFT,
  308.         GTST_String, &(report.summary),
  309.         GTST_MaxChars, LONGFIELD,
  310.         GA_TabCycle, TRUE,
  311.         GT_Underscore, '_',
  312.         TAG_DONE
  313.     );
  314.     /* email to */
  315.     setgadget(182, 32, 312, 12, "EMail to:", PLACETEXT_LEFT);
  316.     TE11_EMailTo = PrevGadPtr = (struct Gadget *) CreateGadget
  317.     (   TEXT_KIND,
  318.         PrevGadPtr,
  319.         &Gadget,
  320.         GTTX_Border, TRUE,
  321.         TAG_DONE
  322.     );
  323.  
  324.     /* sender... */
  325.     setgadget(10,  86, 140, 12, "Sende_r...", NULL);
  326.     BU11_Sender = PrevGadPtr = (struct Gadget *) CreateGadget
  327.     (   BUTTON_KIND,
  328.         PrevGadPtr,
  329.         &Gadget,
  330.         GT_Underscore, '_',
  331.         TAG_DONE
  332.     );
  333.     /* configuration... */
  334.     setgadget(10,  98, 140, 12, "Confi_guration...", NULL);
  335.     BU11_Config = PrevGadPtr = (struct Gadget *) CreateGadget
  336.     (   BUTTON_KIND,
  337.         PrevGadPtr,
  338.         &Gadget,
  339.         GT_Underscore, '_',
  340.         TAG_DONE
  341.     );
  342.     /* text editor... */
  343.     setgadget(10, 110, 140, 12, "Te_xt editor...", NULL);
  344.     BU99_TextEditor = PrevGadPtr = (struct Gadget *) CreateGadget
  345.     (   BUTTON_KIND,
  346.         PrevGadPtr,
  347.         &Gadget,
  348.         GT_Underscore, '_',
  349.         TAG_DONE
  350.     );
  351.  
  352.     /* type */
  353.     setgadget(100, 54, 284, 12, "_Type:", PLACETEXT_LEFT);
  354.     CY11_Type = PrevGadPtr = (struct Gadget *) CreateGadget
  355.     (   CYCLE_KIND,
  356.         PrevGadPtr,
  357.         &Gadget,
  358.         GTCY_Labels, TypeOptions,
  359.         GTCY_Active, report.type,
  360.         GT_Underscore, '_',
  361.         TAG_DONE
  362.     );
  363.  
  364.     /* classification */
  365.     setgadget(100, 66, 284, 12, "Sever_ity:", PLACETEXT_LEFT);
  366.     CY11_Severity = PrevGadPtr = (struct Gadget *) CreateGadget
  367.     (   CYCLE_KIND,
  368.         PrevGadPtr,
  369.         &Gadget,
  370.         GTCY_Labels, SeverityOptions,
  371.         GTCY_Active, report.severity,
  372.         GT_Underscore, '_',
  373.         TAG_DONE
  374.     );
  375.  
  376.     setgadget(10, 144, 238, 87, "Subsystem:", NULL);
  377.     LV11_Subsystem = PrevGadPtr = (struct Gadget *) CreateGadget
  378.     (   LISTVIEW_KIND,
  379.         PrevGadPtr,
  380.         &Gadget,
  381.         GTLV_Labels, &SubsystemList,
  382.         GTLV_ShowSelected, NULL,
  383.         GTLV_Selected, report.subsystem,
  384.         GT_Underscore, '_',
  385.         TAG_DONE
  386.     );
  387.  
  388.     /* 3rd party product */
  389.     setgadget(422, 190, 100, 1, "3rd Party Product:", PLACETEXT_ABOVE);
  390.     TE11_3rdLabel = PrevGadPtr = (struct Gadget *) CreateGadget
  391.     (   TEXT_KIND,
  392.         PrevGadPtr,
  393.         &Gadget,
  394.         TAG_DONE
  395.     );
  396.     /* 3rd party product name */
  397.     setgadget(400, 190, 200, 12, "N_ame:", NULL);
  398.     ST11_3rdName = PrevGadPtr = (struct Gadget *) CreateGadget
  399.     (   STRING_KIND,
  400.         PrevGadPtr,
  401.         &Gadget,
  402.         GTST_String, &(report.thirdname),
  403.         GTST_MaxChars, MEDFIELD,
  404.         GA_TabCycle, TRUE,
  405.         GT_Underscore, '_',
  406.         TAG_DONE
  407.     );
  408.     /* 3rd party product version */
  409.     setgadget(400, 202, 100, 12, "_Version:", NULL);
  410.     ST11_3rdVer = PrevGadPtr = (struct Gadget *) CreateGadget
  411.     (   STRING_KIND,
  412.         PrevGadPtr,
  413.         &Gadget,
  414.         GTST_String, &(report.thirdver),
  415.         GTST_MaxChars, MEDFIELD,
  416.         GA_TabCycle, TRUE,
  417.         GT_Underscore, '_',
  418.         TAG_DONE
  419.     );
  420.     /* 3rd party product manufacturer */
  421.     setgadget(400, 214, 200, 12, "_Manufacturer:", NULL);
  422.     ST11_3rdManuf = PrevGadPtr = (struct Gadget *) CreateGadget
  423.     (   STRING_KIND,
  424.         PrevGadPtr,
  425.         &Gadget,
  426.         GTST_String, &(report.thirdmanuf),
  427.         GTST_MaxChars, MEDFIELD,
  428.         GA_TabCycle, TRUE,
  429.         GT_Underscore, '_',
  430.         TAG_DONE
  431.     );
  432.  
  433.     /* debug tools and wedges */
  434.     setgadget(400, 78, 196, 12, "_Debug tools and wedges:", PLACETEXT_ABOVE);
  435.     ST11_Debug = PrevGadPtr = (struct Gadget *) CreateGadget
  436.     (   STRING_KIND,
  437.         PrevGadPtr,
  438.         &Gadget,
  439.         STRINGA_Justification, GACT_STRINGLEFT,
  440.         GTST_String, &(report.debug),
  441.         GTST_MaxChars, LONGFIELD,
  442.         GA_TabCycle, TRUE,
  443.         GT_Underscore, '_',
  444.         TAG_DONE
  445.     );
  446.  
  447.     /* kickstart version */
  448.     if (report.ks[0] == 0)
  449.         if (GetVar("Kickstart", report.ks, 6, NULL) == -1)
  450.             report.ks[0] = 0;
  451.     setgadget(400, 102, 60, 12, "_Kickstart version:", NULL);
  452.     ST11_KS = PrevGadPtr = (struct Gadget *) CreateGadget
  453.     (   STRING_KIND,
  454.         PrevGadPtr,
  455.         &Gadget,
  456.         GTST_String, &(report.ks),
  457.         GTST_MaxChars, 6,
  458.         GA_TabCycle, TRUE,
  459.         GT_Underscore, '_',
  460.         STRINGA_Justification, GACT_STRINGRIGHT,
  461.         TAG_DONE
  462.     );
  463.     /* workbench version */
  464.     if (report.wb[0] == 0)
  465.         if (GetVar("Workbench", report.wb, 6, NULL) == -1)
  466.             report.wb[0] = 0;
  467.     setgadget(400, 114, 60, 12, "_Workbench version:", NULL);
  468.     ST11_WB = PrevGadPtr = (struct Gadget *) CreateGadget
  469.     (   STRING_KIND,
  470.         PrevGadPtr,
  471.         &Gadget,
  472.         GTST_String, &(report.wb),
  473.         GTST_MaxChars, 6,
  474.         GA_TabCycle, TRUE,
  475.         GT_Underscore, '_',
  476.         STRINGA_Justification, GACT_STRINGRIGHT,
  477.         TAG_DONE
  478.     );
  479.  
  480.     /* program pathname */
  481.     setgadget(400, 138, 196, 12, "P_rogram pathname:", NULL);
  482.     ST11_Pathname = PrevGadPtr = (struct Gadget *) CreateGadget
  483.     (   STRING_KIND,
  484.         PrevGadPtr,
  485.         &Gadget,
  486.         GTST_String, &(report.pp),
  487.         GTST_MaxChars, LONGFIELD,
  488.         GA_TabCycle, TRUE,
  489.         GT_Underscore, '_',
  490.         TAG_DONE
  491.     );
  492.     /* program... */
  493.     setgadget(598, 138, 28, 12, "...", NULL);
  494.     BU11_PathnameASL = PrevGadPtr = (struct Gadget *) CreateGadget
  495.     (   BUTTON_KIND,
  496.         PrevGadPtr,
  497.         &Gadget,
  498.         GT_Underscore, '_',
  499.         TAG_DONE
  500.     );
  501.     /* program version */
  502.     setgadget(400, 150, 196, 12, "Program v_ersion:", NULL);
  503.     ST11_Version = PrevGadPtr = (struct Gadget *) CreateGadget
  504.     (   STRING_KIND,
  505.         PrevGadPtr,
  506.         &Gadget,
  507.         GTST_String, &(report.pv),
  508.         GTST_MaxChars, LONGFIELD,
  509.         GA_TabCycle, TRUE,
  510.         GT_Underscore, '_',
  511.         TAG_DONE
  512.     );
  513.  
  514.     drawgadgets((UWORD) ~0);
  515.  
  516.     updatereportgadgets(); // we do need this here, so that gadgets are
  517.                            // ghosted as appropriate
  518.     ActivateGadget(ST11_Summary, MainWindowPtr, NULL);
  519.  
  520.     loop();
  521.     readreportgadgets();
  522.     closewindow();
  523. }
  524.  
  525. MODULE void readreportgadgets(void)
  526. {   strcpy
  527.     (   report.summary,
  528.         ((struct StringInfo *) ST11_Summary->SpecialInfo)->Buffer
  529.     );
  530.     if (report.type == COM)
  531.     {   strcpy
  532.         (   report.thirdver,
  533.             ((struct StringInfo *) ST11_3rdVer->SpecialInfo)->Buffer
  534.         );
  535.         strcpy
  536.         (   report.thirdname,
  537.             ((struct StringInfo *) ST11_3rdName->SpecialInfo)->Buffer
  538.         );
  539.         strcpy
  540.         (   report.thirdmanuf,
  541.             ((struct StringInfo *) ST11_3rdManuf->SpecialInfo)->Buffer
  542.         );
  543.     } elif (report.type == BUG)
  544.     {   strcpy
  545.         (   report.pp,
  546.             ((struct StringInfo *) ST11_Pathname->SpecialInfo)->Buffer
  547.         );
  548.         strcpy
  549.         (   report.pv,
  550.             ((struct StringInfo *) ST11_Version->SpecialInfo)->Buffer
  551.         );
  552.     }
  553.     if (report.type != ENH)
  554.     {   strcpy
  555.         (   report.ks,
  556.             ((struct StringInfo *) ST11_KS->SpecialInfo)->Buffer
  557.         );
  558.         strcpy
  559.         (   report.wb,
  560.             ((struct StringInfo *) ST11_WB->SpecialInfo)->Buffer
  561.         );
  562.         strcpy
  563.         (   report.debug,
  564.             ((struct StringInfo *) ST11_Debug->SpecialInfo)->Buffer
  565.         );
  566. }   }
  567.  
  568. AGLOBAL void savereport(ABOOL saveas)
  569. { /*    # Subject: <subject><LF>
  570.         # Type: bug|compat|enhancement<LF>
  571. 1,3     # Subsystem: <subsystem><LF>
  572. 2       # ProductName: <name> (vers=<version>)
  573. 2       # ProductInfo: :<manufacturer>:
  574.         # Severity: a|b|c|ok|e
  575. 1       # Release: KS=<version>,WB=<version>,Program=<version>
  576. 2       # Release: KS=<version>,WB=<version>
  577.         # Date: <weekday> dd-Mon-yy hh:mm:ss
  578.         # Refer: <refer>
  579.         # Path: <path>
  580.         # ReferID: <referid>
  581.         # Config: <config>
  582. 1,2a-c    ### BRIEF BUG DESCRIPTION:
  583. 1,2a-c    ### BUG GENERATION PROCEDURE OR EXAMPLE:
  584. 1,2     ### ALSO RUNNING:
  585.         <debug>
  586. 1,2     ### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS OR HARDWARE,
  587.         EXPLAIN:
  588. 2a-c    ### WHAT DEVELOPER IS DOING IN THAT AREA OF SW OR HW:    
  589. 1,2a-c    ### RELATED PROBLEMS:
  590. 3       ### ENHANCEMENT REQUEST: */
  591.  
  592.     readreportgadgets();
  593.  
  594.     strcpy(IOBuffer, "# Subject: ");
  595.     strcat(IOBuffer, report.summary);
  596.     strcat(IOBuffer, "\n# Type: ");
  597.     if (report.type == BUG)
  598.     strcat(IOBuffer, "bug");
  599.     elif (report.type == COM)
  600.         strcat(IOBuffer, "compat");
  601.     else /* assumes (report.type == ENH) */
  602.         strcat(IOBuffer, "enhancement");
  603.     strcat(IOBuffer, "\n");
  604.     if (report.type == BUG || report.type == ENH)
  605.     {    strcat(IOBuffer, "# Subsystem: ");
  606.         strcat(IOBuffer, subsystems[report.subsystem].unfriendly);
  607.     strcat(IOBuffer, "\n");
  608.     } else
  609.     {    strcat(IOBuffer, "# ProductName: ");
  610.     strcat(IOBuffer, report.thirdname);
  611.         strcat(IOBuffer, " (vers=");
  612.         strcat(IOBuffer, report.thirdver);
  613.         strcat(IOBuffer, ")\n# ProductInfo: :");
  614.         strcat(IOBuffer, report.thirdmanuf);
  615.         strcat(IOBuffer, ":\n");
  616.     }
  617.     strcat(IOBuffer, "# Severity: ");
  618.     if (report.type == ENH)
  619.         strcat(IOBuffer, "e");
  620.     elif (report.severity == 0)
  621.         strcat(IOBuffer, "a");
  622.     elif (report.severity == 1)
  623.         strcat(IOBuffer, "b");
  624.     elif (report.severity == 2)
  625.         strcat(IOBuffer, "c");
  626.     else /* assumes report.severity == 3 */
  627.     strcat(IOBuffer, "ok");
  628.     strcat(IOBuffer, "\n");
  629.     if (report.type == BUG || report.type == COM)
  630.     {    strcat(IOBuffer, "# Release: KS=");
  631.         strcat(IOBuffer, report.ks);
  632.         strcat(IOBuffer, ",WB=");
  633.         strcat(IOBuffer, report.wb);
  634.         if (report.type == BUG)
  635.         {    strcat(IOBuffer, ",Program=");
  636.             strcat(IOBuffer, report.pv);
  637.         }
  638.         strcat(IOBuffer, "\n");
  639.     }
  640.     
  641.     getdate();
  642.     strcat(IOBuffer, "# Date: ");
  643.     strcat(IOBuffer, weekdaystring);
  644.     strcat(IOBuffer, " ");
  645.     strcat(IOBuffer, datestring);
  646.     strcat(IOBuffer, " ");
  647.     strcat(IOBuffer, timestring);
  648.     strcat(IOBuffer, "\n");
  649.     strcat(IOBuffer, report.refer);
  650.     strcat(IOBuffer, report.path);
  651.     strcat(IOBuffer, report.referid);
  652.     strcat(IOBuffer, report.config);
  653.     strcat(IOBuffer, "\n");
  654.  
  655.     if (report.type == BUG || (report.type == COM && report.severity != 3))
  656.     {   strcat
  657.         (   IOBuffer,
  658.             "### BRIEF BUG DESCRIPTION:\n"
  659.         );
  660.         strcat(IOBuffer, report.textfield[0]);
  661.         strcat
  662.         (   IOBuffer,
  663.             "\n\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n"
  664.     );
  665.         strcat(IOBuffer, report.textfield[1]);
  666.         strcat(IOBuffer, "\n\n");
  667.     }
  668.     if (report.type == BUG || report.type == COM)
  669.     {   strcat(IOBuffer, "### ALSO RUNNING:\n");
  670.         strcat(IOBuffer, report.debug);
  671.         strcat
  672.         (   IOBuffer,
  673.             "\n\n### IF THIS WORKS DIFFERENTLY ON "
  674.             "OTHER VERSIONS OR HARDWARE, EXPLAIN:\n"
  675.         );
  676.         strcat(IOBuffer, report.textfield[2]);
  677.         strcat(IOBuffer, "\n\n");
  678.     }
  679.     if (report.type == COM && report.severity != 3)
  680.     {   strcat
  681.         (   IOBuffer,
  682.             "### WHAT DEVELOPER IS DOING IN THAT AREA OF HW OR SW:\n"
  683.         );
  684.         strcat(IOBuffer, report.textfield[3]);
  685.         strcat(IOBuffer, "\n\n");
  686.     }
  687.     if (report.type == BUG || (report.type == COM && report.severity != 3))
  688.     {   strcat(IOBuffer, "### RELATED PROBLEMS:\n");
  689.         strcat(IOBuffer, report.textfield[4]);
  690.         strcat(IOBuffer, "\n\n");
  691.     } elif (report.type == ENH)
  692.     {   strcat(IOBuffer, "### ENHANCEMENT REQUEST:\n");
  693.         strcat(IOBuffer, report.textfield[5]);
  694.         strcat(IOBuffer, "\n\n");
  695.     }
  696.  
  697.     if (!report.output[0] || saveas) // if we need a filename
  698.     {   if (saveasl("Save Bug Report"))
  699.         {   strcpy(report.output, aslresult);
  700.             writeout(report.output);
  701. }   }   }
  702.     
  703. AGLOBAL void report_loop(ULONG class, struct Gadget* addr, UWORD code, UWORD qual)
  704. {   if (page == 11)
  705.     {   if (class == IDCMP_RAWKEY && report.type != COM)
  706.         {   if (qual & IEQUALIFIER_CONTROL)
  707.             {   if (code == SCAN_UP)
  708.                 {   GT_SetGadgetAttrs
  709.                     (   LV11_Subsystem,
  710.                         MainWindowPtr,
  711.                         NULL,
  712.                         GTLV_Top, 0,
  713.                         TAG_DONE
  714.                     );
  715.                 } elif (code == SCAN_DOWN)
  716.                 {   GT_SetGadgetAttrs
  717.                     (   LV11_Subsystem,
  718.                         MainWindowPtr,
  719.                         NULL,
  720.                         GTLV_Top, SUBSYSTEMS - 10 + 1,
  721.                         // this must change according to height of listview
  722.                         TAG_DONE
  723.                     );
  724.         }   }   }
  725.         elif (class == IDCMP_VANILLAKEY)
  726.         {   code = toupper(code);
  727.             if (code == ESCAPE)
  728.             {   page = 0;
  729.             } elif (code == 'N')
  730.             {   page = 12;
  731.             } elif (code == 'T')
  732.             {   if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  733.                 {   if (report.type == 0)
  734.                     {   report.type = 2;
  735.                     } else report.type--;
  736.                 } else
  737.                 {   if (report.type == 2)
  738.                     {   report.type = 0;
  739.                     } else report.type++;
  740.                 }
  741.                 updatereportgadgets();
  742.             } elif (code == 'S')
  743.             {   ActivateGadget(ST11_Summary, MainWindowPtr, NULL);
  744.             } elif (code == 'X')
  745.             {   launcheditor(report.output);
  746.             } elif (code == 'R')
  747.             {   page = 12;
  748.             } elif (code == 'G')
  749.             {   page = 13;
  750.             } elif (report.type != ENH)
  751.             {   if (code == 'K')
  752.                 {   ActivateGadget(ST11_KS, MainWindowPtr, NULL);
  753.                 } elif (code == 'W')
  754.                 {   ActivateGadget(ST11_WB, MainWindowPtr, NULL);
  755.                 } elif (code == 'D')
  756.                 {   ActivateGadget(ST11_Debug, MainWindowPtr, NULL);
  757.                 } elif (code == 'I')
  758.                 {   if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  759.                     {   if (report.severity == 0)
  760.                         {   report.severity = 3;
  761.                         } else report.severity--;
  762.                     } else
  763.                     {   if (report.severity == 3)
  764.                         {   report.severity = 0;
  765.                         } else report.severity++;
  766.                     }
  767.                     if (report.type == BUG && report.severity == 3)
  768.                     {   report.severity = 0;
  769.                     }
  770.                     GT_SetGadgetAttrs
  771.                     (   CY11_Severity,
  772.                         MainWindowPtr,
  773.                         NULL,
  774.                         GTCY_Active, report.severity,
  775.                         TAG_DONE
  776.                     );
  777.                 } elif (report.type == BUG)
  778.                 {   if (code == 'P')
  779.                     {   ActivateGadget(ST11_Pathname, MainWindowPtr, NULL);
  780.                     } elif (code == 'E')
  781.                     {   ActivateGadget(ST11_Version, MainWindowPtr, NULL);
  782.                 }   }
  783.                 else
  784.                 {   // assert(report.type == COM);
  785.                     if (code == 'A')
  786.                     {   ActivateGadget(ST11_3rdName, MainWindowPtr, NULL);
  787.                     } elif (code == 'V')
  788.                     {   ActivateGadget(ST11_3rdVer, MainWindowPtr, NULL);
  789.                     } elif (code == 'M')
  790.                     {   ActivateGadget(ST11_3rdManuf, MainWindowPtr, NULL);
  791.         }   }   }   }
  792.         elif (class == IDCMP_GADGETUP)
  793.         {   if (addr == BU99_Right)
  794.             {   page = 0;
  795.             } elif (addr == BU11_Sender)
  796.             {   page = 12;
  797.             } elif (addr == BU11_Config)
  798.             {   page = 13;
  799.             } elif (addr == BU99_TextEditor)
  800.             {   launcheditor(report.output);
  801.             }
  802.             elif (addr == CY11_Type)
  803.             {   report.type = code;
  804.                 updatereportgadgets();
  805.             } elif (report.type != COM && addr == LV11_Subsystem)
  806.             {   // code is the position within the list.
  807.                 report.subsystem = code;
  808.             } elif (report.type != ENH)
  809.             {   if (addr == CY11_Severity)
  810.                 {   report.severity = code;
  811.                     if (report.type == BUG && report.severity == 3)
  812.                     {   report.severity = 0;
  813.                         GT_SetGadgetAttrs
  814.                         (   CY11_Severity,
  815.                             MainWindowPtr,
  816.                             NULL,
  817.                             GTCY_Active, report.severity,
  818.                             TAG_DONE
  819.                         );
  820.                 }   }
  821.                 elif (report.type == BUG)
  822.                 {   if (addr == ST11_Pathname)
  823.                     {   refreshpv();
  824.                     } elif (addr == BU11_PathnameASL)
  825.                     {   if (asl())
  826.                         {   GT_SetGadgetAttrs
  827.                             (   ST11_Pathname,
  828.                                 MainWindowPtr,
  829.                                 NULL,
  830.                                 GTST_String, aslresult,
  831.                                 TAG_DONE
  832.                             );
  833.                             refreshpv();
  834.     }   }   }   }   }   }
  835.     elif (page == 12)
  836.     {   if (class == IDCMP_GADGETUP)
  837.         {   if (addr == BU99_Right)
  838.             {   if (certified)
  839.                     page = 33;
  840.                 else page = 11;
  841.         }   }
  842.         elif (class == IDCMP_VANILLAKEY)
  843.         {   code = toupper(code);
  844.             if (code == ESCAPE)
  845.             {   if (certified)
  846.                     page = 33;
  847.                 else page = 11;
  848.             } elif (code == 'F')
  849.             {   ActivateGadget(ST12_FirstName, MainWindowPtr, NULL);
  850.             } elif (code == 'L')
  851.             {   ActivateGadget(ST12_LastName,  MainWindowPtr, NULL);
  852.             } elif (code == 'C')
  853.             {   ActivateGadget(ST12_Company,   MainWindowPtr, NULL);
  854.             } elif (code == 'D')
  855.             {   ActivateGadget(ST12_Developer, MainWindowPtr, NULL);
  856.             } elif (code == 'P')
  857.             {   ActivateGadget(ST12_Phone,     MainWindowPtr, NULL);
  858.             } elif (code == 'E')
  859.             {   ActivateGadget(ST12_EMail,     MainWindowPtr, NULL);
  860.     }   }   }
  861.     elif (page == 13)
  862.     {   if (class == IDCMP_VANILLAKEY)
  863.         {   code = toupper(code);
  864.             if (code == ESCAPE)
  865.             {   page = 11;
  866.             } elif (code == 'A')
  867.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  868.                 {   if (report.agnus == 0)
  869.                         report.agnus = 5;
  870.                     else report.agnus--;
  871.                 } else
  872.                 {   if (report.agnus == 5)
  873.                         report.agnus = 0;
  874.                     else report.agnus++;
  875.                 }
  876.                 if (report.agnus == 0)
  877.                     report.denise = 0;
  878.                 elif (report.agnus == 1 || report.agnus == 2)
  879.                     report.denise = 1;
  880.                 else
  881.                 {   /* assert(report.agnus == 3 || report.agnus == 4); */
  882.                     report.denise = 2;
  883.                 }
  884.                 GT_SetGadgetAttrs
  885.                 (   MX13_Agnus,
  886.                     MainWindowPtr,
  887.                     NULL,
  888.                     GTMX_Active, report.agnus,
  889.                     TAG_DONE
  890.                 );
  891.                 GT_SetGadgetAttrs
  892.                 (   MX13_Denise,
  893.                     MainWindowPtr,
  894.                     NULL,
  895.                     GTMX_Active, report.denise,
  896.                     TAG_DONE
  897.                 );
  898.             } elif (code == 'C')
  899.             {   ActivateGadget(ST13_Chip, MainWindowPtr, NULL);
  900.             } elif (code == 'E')
  901.             {   ActivateGadget(ST13_Expansion, MainWindowPtr, NULL);
  902.             } elif (code == 'H')
  903.             {   ActivateGadget(ST13_Hard, MainWindowPtr, NULL);
  904.             } elif (code == 'L')
  905.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  906.                 {   if (report.denise == 0)
  907.                         report.denise = 3;
  908.                     else report.denise--;
  909.                 } else
  910.                 {   if (report.denise == 3)
  911.                         report.denise = 0;
  912.                     else report.denise++;
  913.                 }
  914.                 GT_SetGadgetAttrs
  915.                 (   MX13_Denise,
  916.                     MainWindowPtr,
  917.                     NULL,
  918.                     GTMX_Active, report.denise,
  919.                     TAG_DONE
  920.                 );
  921.             } elif (code == 'M')
  922.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  923.                 {   if (report.model == 0)
  924.                         report.model = MODELS;
  925.                     else report.model--;
  926.                 } else
  927.                 {   if (report.model == CPUS)
  928.                         report.model = 0;
  929.                     else report.model++;
  930.                 }
  931.                 GT_SetGadgetAttrs
  932.                 (   MX13_Model,
  933.                     MainWindowPtr,
  934.                     NULL,
  935.                     GTMX_Active, report.model,
  936.                     TAG_DONE
  937.                 );
  938.             } elif (code == 'N')
  939.             {   ActivateGadget(IN13_Floppies, MainWindowPtr, NULL);
  940.             } elif (code == 'P')
  941.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  942.                 {   if (report.cpu == 0)
  943.                         report.cpu = CPUS;
  944.                     else report.cpu--;
  945.                 } else
  946.                 {   if (report.cpu == CPUS)
  947.                         report.cpu = 0;
  948.                     else report.cpu++;
  949.                 }
  950.                 GT_SetGadgetAttrs
  951.                 (   MX13_CPU,
  952.                     MainWindowPtr,
  953.                     NULL,
  954.                     GTMX_Active, report.cpu,
  955.                     TAG_DONE
  956.                 );
  957.             } elif (code == 'S')
  958.             {   ActivateGadget(ST13_Fast, MainWindowPtr, NULL);
  959.         }   }
  960.         elif (class == IDCMP_GADGETUP)
  961.         {   if (addr == BU99_Right)
  962.                 page = 11;
  963.             elif (addr == IN13_Floppies)
  964.             {   report.floppies = ((struct StringInfo *) IN13_Floppies->SpecialInfo)->LongInt;
  965.                 if (report.floppies < 0)
  966.                 {   report.floppies = 0;
  967.                     GT_SetGadgetAttrs
  968.                     (   IN13_Floppies,
  969.                         MainWindowPtr,
  970.                         NULL,
  971.                         GTIN_Number, report.floppies,
  972.                         TAG_DONE
  973.                     );
  974.                 } elif (report.floppies > 3)
  975.                 {   report.floppies = 3;
  976.                     GT_SetGadgetAttrs
  977.                     (   IN13_Floppies,
  978.                         MainWindowPtr,
  979.                         NULL,
  980.                         GTIN_Number, report.floppies,
  981.                         TAG_DONE
  982.                     );
  983.         }   }   }
  984.         elif (class == IDCMP_GADGETDOWN)
  985.         {   if (addr == MX13_Model)
  986.                 report.model = code;
  987.             elif (addr == MX13_CPU)
  988.                 report.cpu = code;
  989.             elif (addr == MX13_Denise)
  990.                 report.denise = code;
  991.             elif (addr == MX13_Agnus)
  992.             {   report.agnus = code;
  993.                 if (code == 0)
  994.                     report.denise = 0;
  995.                 elif (code == 1 || code == 2)
  996.                     report.denise = 1;
  997.                 else
  998.                 {   /* assert(code == 3 || code == 4); */
  999.                     report.denise = 2;
  1000.                 }
  1001.                 GT_SetGadgetAttrs
  1002.                 (   MX13_Denise,
  1003.                     MainWindowPtr,
  1004.                     NULL,
  1005.                     GTMX_Active, report.denise,
  1006.                     TAG_DONE
  1007.                 );
  1008. }   }   }   }
  1009.  
  1010. MODULE void refreshpv(void)
  1011. {       ULONG   i;
  1012.     BPTR    FileHandle;
  1013.  
  1014.         strcpy(string, "Version ");
  1015.     strcat
  1016.     (   string,
  1017.             ((struct StringInfo *) ST11_Pathname->SpecialInfo)->Buffer
  1018.     );
  1019.         if (!(FileHandle = (BPTR) Open("T:ReportPlus.temp", MODE_NEWFILE)))
  1020.         rq("Can't open T:ReportPlus.temp for writing!");
  1021.     if (!Execute(string, NULL, FileHandle))
  1022.             rq("Can't execute Version!");
  1023.     if (!Close(FileHandle))
  1024.         rq("Can't close T:ReportPlus.temp for writing!");
  1025.  
  1026.         readordie("T:ReportPlus.temp");
  1027.  
  1028.     DeleteFile("T:ReportPlus.temp"); /* returns FALSE for failure */
  1029.     for (i = 0; i <= MEDFIELD; i++)
  1030.             if (IOBuffer[i] == LF)
  1031.             {   IOBuffer[i] = 0;
  1032.                 break;
  1033.             }
  1034.     GT_SetGadgetAttrs
  1035.         (   ST11_Version,
  1036.         MainWindowPtr,
  1037.         NULL,
  1038.         GTST_String, IOBuffer,
  1039.         TAG_DONE
  1040.     );
  1041. }
  1042.  
  1043. AGLOBAL void report_die(void)
  1044. {   if (SubsystemNodes)
  1045.     {   FreeNameNodes(&SubsystemList);
  1046.         SubsystemNodes = FALSE;
  1047. }   }
  1048.  
  1049. AGLOBAL void report_init(void)
  1050. {   ULONG i;
  1051.  
  1052.     NewList(&SubsystemList);
  1053.     for (i = 0; i <= SUBSYSTEMS; i++)
  1054.         AddNameToTail(&SubsystemList, subsystems[i].friendly);
  1055.     SubsystemNodes = TRUE;
  1056.  
  1057.     newreport(FALSE);
  1058. }
  1059.  
  1060. AGLOBAL void sender(void)
  1061. {   /* PAGE 12 *************************************************************/
  1062.  
  1063.     verynewwindow
  1064.     (   SENDERWIDTH, SENDERHEIGHT,
  1065.         "Report+: Sender Details",
  1066.         BUTTONIDCMP | STRINGIDCMP
  1067.     );
  1068.  
  1069.     if ((!report.loaded) && readin("S:Report.sender"))
  1070.     {   /* # Refer: <last>,<first> (<company> ,phone <phone>)<LF>
  1071.            # Path: <email><LF>
  1072.            # ReferID: <developer><LF> */
  1073.  
  1074.         offset = 0;
  1075.         parse("# Refer: ");
  1076.         parse(",");
  1077.         strcpy(report.lastname,  string);
  1078.         parse(" (");
  1079.         strcpy(report.firstname, string);
  1080.         parse(" ,phone ");
  1081.         strcpy(report.company,   string);
  1082.         parse(")\n# Path: ");
  1083.         strcpy(report.phone,     string);
  1084.         parse("\n# ReferID: ");
  1085.         strcpy(report.email,     string);
  1086.         parse("\n");
  1087.         strcpy(report.developer, string);
  1088.     }
  1089.  
  1090.     /* first name */
  1091.     setgadget(166, 22, 128, 12, "_First name:", NULL);
  1092.     ST12_FirstName = PrevGadPtr = (struct Gadget *) CreateGadget
  1093.     (   STRING_KIND,
  1094.     PrevGadPtr,
  1095.     &Gadget,
  1096.     GTST_String, &(report.firstname),
  1097.     GTST_MaxChars, MEDFIELD,
  1098.     GA_TabCycle, TRUE,
  1099.         GT_Underscore, '_',
  1100.     TAG_DONE
  1101.     );
  1102.  
  1103.     /* last name */
  1104.     setgadget(166, 34, 128, 12, "_Last name:", NULL);
  1105.     ST12_LastName = PrevGadPtr = (struct Gadget *) CreateGadget
  1106.     (   STRING_KIND,
  1107.     PrevGadPtr,
  1108.     &Gadget,
  1109.     GTST_String, &(report.lastname),
  1110.     GTST_MaxChars, MEDFIELD,
  1111.     GA_TabCycle, TRUE,
  1112.         GT_Underscore, '_',
  1113.     TAG_DONE
  1114.     );
  1115.  
  1116.     /* company name */
  1117.     setgadget(166, 46, 128, 12, "_Company:", NULL);
  1118.     ST12_Company = PrevGadPtr = (struct Gadget *) CreateGadget
  1119.     (   STRING_KIND,
  1120.     PrevGadPtr,
  1121.     &Gadget,
  1122.     GTST_String, &(report.company),
  1123.     GTST_MaxChars, MEDFIELD,
  1124.     GA_TabCycle, TRUE,
  1125.         GT_Underscore, '_',
  1126.     TAG_DONE
  1127.     );
  1128.  
  1129.     /* phone */
  1130.     setgadget(166, 58, 128, 12, "_Phone number:", NULL);
  1131.     ST12_Phone = PrevGadPtr = (struct Gadget *) CreateGadget
  1132.     (   STRING_KIND,
  1133.     PrevGadPtr,
  1134.     &Gadget,
  1135.     GTST_String, &(report.phone),
  1136.     GTST_MaxChars, MEDFIELD,
  1137.     GA_TabCycle, TRUE,
  1138.         GT_Underscore, '_',
  1139.     TAG_DONE
  1140.     );
  1141.  
  1142.     /* developer number */
  1143.     setgadget(166, 70, 128, 12, "_Developer number:", NULL);
  1144.     ST12_Developer = PrevGadPtr = (struct Gadget *) CreateGadget
  1145.     (   STRING_KIND,
  1146.     PrevGadPtr,
  1147.     &Gadget,
  1148.         GTST_String, &(report.developer),
  1149.         GTST_MaxChars, LONGFIELD,
  1150.     GA_TabCycle, TRUE,
  1151.         GT_Underscore, '_',
  1152.     TAG_DONE
  1153.     );
  1154.  
  1155.     /* email */
  1156.     setgadget(166, 82, 256, 12, "_EMail:", NULL);
  1157.     ST12_EMail = PrevGadPtr = (struct Gadget *) CreateGadget
  1158.     (    STRING_KIND,
  1159.     PrevGadPtr,
  1160.     &Gadget,
  1161.     GTST_String, &(report.email),
  1162.     GTST_MaxChars, MEDFIELD,
  1163.     GA_TabCycle, TRUE,
  1164.         GT_Underscore, '_',
  1165.     TAG_DONE
  1166.     );
  1167.  
  1168.     /* There are 14 gadgets:
  1169.        BU99_Right
  1170.        BU99_TextEditor
  1171.        ST12_FirstName (2 subgadgets)
  1172.        ST12_LastName (2 subgadgets)
  1173.        ST12_Company (2 subgadgets)
  1174.        ST12_Phone (2 subgadgets)
  1175.        ST12_Developer (2 subgadgets)
  1176.        ST12_EMail (2 subgadgets) */
  1177.     drawgadgets(14);
  1178.  
  1179.     ActivateGadget(ST12_FirstName, MainWindowPtr, NULL);
  1180.     loop();
  1181.  
  1182.     if (!report.loaded)
  1183.     {   /* write out S:Report.sender
  1184.         # Refer: <last>,<first> (<company> ,phone <phone>)<LF>
  1185.         # Path: <email><LF>
  1186.         # ReferID: <developer><LF> */
  1187.  
  1188.         strcpy(report.refer, "# Refer: ");
  1189.         strcat
  1190.         (   report.refer,
  1191.             ((struct StringInfo *) ST12_LastName->SpecialInfo)->Buffer
  1192.         );
  1193.         strcat(report.refer, ",");
  1194.         strcat
  1195.         (   report.refer,
  1196.             ((struct StringInfo *) ST12_FirstName->SpecialInfo)->Buffer
  1197.         );
  1198.         strcat(report.refer, " (");
  1199.         strcat
  1200.         (   report.refer,
  1201.             ((struct StringInfo *) ST12_Company->SpecialInfo)->Buffer
  1202.         );
  1203.         strcat(report.refer, " ,phone ");
  1204.         strcat
  1205.         (   report.refer,
  1206.             ((struct StringInfo *) ST12_Phone->SpecialInfo)->Buffer
  1207.         );
  1208.         strcat(report.refer, ")\n");
  1209.  
  1210.         strcpy(report.path, "# Path: ");
  1211.         strcat
  1212.         (    report.path,
  1213.             ((struct StringInfo *) ST12_EMail->SpecialInfo)->Buffer
  1214.         );
  1215.         strcat(report.path, "\n");
  1216.  
  1217.         strcpy(report.referid, "# ReferID: ");
  1218.         strcat
  1219.         (   report.referid,
  1220.             ((struct StringInfo *) ST12_Developer->SpecialInfo)->Buffer
  1221.         );
  1222.         strcat(report.referid, "\n");
  1223.  
  1224.         strcpy(IOBuffer, report.refer);
  1225.         strcat(IOBuffer, report.path);
  1226.         strcat(IOBuffer, report.referid);
  1227.     
  1228.         writeout("S:Report.sender");
  1229.     }
  1230.     closewindow();
  1231. }
  1232.     
  1233. AGLOBAL void config(void)
  1234. {   /* PAGE 13 ************************************************************** */
  1235.     
  1236.     UBYTE i;
  1237.         
  1238.     verynewwindow
  1239.     (   CONFIGWIDTH, CONFIGHEIGHT,
  1240.         "Report+: Configuration Details",
  1241.         BUTTONIDCMP | STRINGIDCMP | MXIDCMP
  1242.     );
  1243.     
  1244.     if ((!report.loaded) && readin("S:Report.config"))
  1245.     {   /*  # Config: <model>,<cpu>,A=AA|ECS-pal|ECS|old-pal|old,
  1246.             D=AA|ECS|old,RAM=<chip>megC/<fast>megF,TD=<floppies>,
  1247.             HD=<controller>,<cards><LF> */
  1248.  
  1249.         offset = 0;
  1250.         parse("# Config: ");
  1251.     parse(",");
  1252.         report.model = 4;
  1253.     for (i = 0; i <= MODELS; i++)
  1254.     {   if (!stricmp(string, ModelOptions[i]))
  1255.         {   report.model = i;
  1256.                 break; // for speed
  1257.     }   }
  1258.         parse(",A=");
  1259.     report.cpu = 1;
  1260.     for (i = 0; i <= CPUS; i++)
  1261.     {   if (!stricmp(string, CPUOptions[i]))
  1262.         {   report.cpu = i;
  1263.                 break; // for speed
  1264.         }   }
  1265.  
  1266.     parse(",D=");
  1267.     if (!stricmp(string, "AA"))
  1268.         report.agnus = 0;
  1269.     elif (!stricmp(string, "ECS-pal"))
  1270.         report.agnus = 1;
  1271.     elif (!stricmp(string, "ECS"))
  1272.         report.agnus = 2;
  1273.     elif (!stricmp(string, "old-pal"))
  1274.         report.agnus = 3;
  1275.     else /* if (!stricmp(string, "old")) */
  1276.         report.agnus = 4;
  1277.  
  1278.     parse(",RAM=");
  1279.     if (!stricmp(string, "AA"))
  1280.         report.denise = 0;
  1281.     elif (!stricmp(string, "ECS"))
  1282.         report.denise = 1;
  1283.     else /* if (!stricmp(string, "old")) */
  1284.         report.denise = 2;
  1285.  
  1286.     parse("megC/");
  1287.     strcpy(report.chipram, string);
  1288.  
  1289.     parse("megF,TD=");
  1290.     strcpy(report.fastram, string);
  1291.  
  1292.     parse(",HD=");
  1293.     report.floppies = atol(string);
  1294.  
  1295.     parse(",");
  1296.     strcpy(report.hard, string);
  1297.  
  1298.     parse("\n");
  1299.     strcpy(report.expansion, string);
  1300.     }
  1301.  
  1302.     /* These formal coordinates of these text gadgets must not overlap any
  1303.     other gadgets, otherwise any such overlapped gadgets will not be
  1304.     selectable, with the mouse at least. This definitely applies to radio
  1305.     and string gadgets, and most likely other types.
  1306.  
  1307.     model */
  1308.     setgadget(64, 30, 6 * FONTX, 0, "_Model:", PLACETEXT_ABOVE);
  1309.     TE13_ModelText = PrevGadPtr = (struct Gadget *) CreateGadget
  1310.     (   TEXT_KIND,
  1311.         PrevGadPtr,
  1312.         &Gadget,
  1313.         GT_Underscore, '_',
  1314.         TAG_DONE
  1315.     );
  1316.     setgadget(64, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1317.     MX13_Model = PrevGadPtr = (struct Gadget *) CreateGadget
  1318.     (   MX_KIND,
  1319.         PrevGadPtr,
  1320.         &Gadget,
  1321.         GTMX_Labels, &ModelOptions,
  1322.         GTMX_Active, report.model,
  1323.         TAG_DONE
  1324.     );
  1325.  
  1326.     /* Agnus */
  1327.     setgadget(192, 30, 17 * FONTX, 0, "_Agnus/Alice Type:", PLACETEXT_ABOVE);
  1328.     TE13_AgnusText = PrevGadPtr = (struct Gadget *) CreateGadget
  1329.     (   TEXT_KIND,
  1330.     PrevGadPtr,
  1331.     &Gadget,
  1332.         GT_Underscore, '_',
  1333.         TAG_DONE
  1334.     );
  1335.     setgadget(192, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1336.     MX13_Agnus = PrevGadPtr = (struct Gadget *) CreateGadget
  1337.     (   MX_KIND,
  1338.     PrevGadPtr,
  1339.     &Gadget,
  1340.     GTMX_Labels, &AgnusOptions,
  1341.     GTMX_Active, report.agnus,
  1342.     TAG_DONE
  1343.     );
  1344.  
  1345.     /* Denise */
  1346.     setgadget(352, 30, 17 * FONTX, 0, "Denise/_Lisa Type:", PLACETEXT_ABOVE);
  1347.     TE13_DeniseText = PrevGadPtr = (struct Gadget *) CreateGadget
  1348.     (   TEXT_KIND,
  1349.     PrevGadPtr,
  1350.     &Gadget,
  1351.         GT_Underscore, '_',
  1352.     TAG_DONE
  1353.     );
  1354.     setgadget(352, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1355.     MX13_Denise = PrevGadPtr = (struct Gadget *) CreateGadget
  1356.     (   MX_KIND,
  1357.         PrevGadPtr,
  1358.         &Gadget,
  1359.         GTMX_Labels, &DeniseOptions,
  1360.         GTMX_Active, report.denise,
  1361.         TAG_DONE
  1362.     );
  1363.  
  1364.     /* CPU */
  1365.     setgadget(512, 30, 10 * FONTX, 0, "_Processor:", PLACETEXT_ABOVE);
  1366.     // extra spaces ensure consistent centring
  1367.     TE13_CPUText = PrevGadPtr = (struct Gadget *) CreateGadget
  1368.     (   TEXT_KIND,
  1369.         PrevGadPtr,
  1370.         &Gadget,
  1371.         GT_Underscore, '_',
  1372.         TAG_DONE
  1373.     );
  1374.     setgadget(512, 30, 0, 0, NULL, PLACETEXT_RIGHT);
  1375.     MX13_CPU = PrevGadPtr = (struct Gadget *) CreateGadget
  1376.     (   MX_KIND,
  1377.         PrevGadPtr,
  1378.         &Gadget,
  1379.         GTMX_Labels, &CPUOptions,
  1380.         GTMX_Active, report.cpu,
  1381.         TAG_DONE
  1382.     );
  1383.  
  1384.     /* chip RAM */
  1385.     setgadget(465, 110, 1, 12, "Mb", PLACETEXT_RIGHT);
  1386.     TE13_ChipText = PrevGadPtr = (struct Gadget *) CreateGadget
  1387.     (   TEXT_KIND,
  1388.         PrevGadPtr,
  1389.         &Gadget,
  1390.         TAG_DONE
  1391.     );
  1392.     setgadget(400, 110, 64, 12, "_Chip RAM:", NULL);
  1393.     ST13_Chip = PrevGadPtr = (struct Gadget *) CreateGadget
  1394.     (   STRING_KIND,
  1395.         PrevGadPtr,
  1396.         &Gadget,
  1397.         GTST_String, &(report.chipram),
  1398.         GTST_MaxChars, 4,
  1399.         GA_TabCycle, TRUE,
  1400.         GT_Underscore, '_',
  1401.         TAG_DONE
  1402.     );
  1403.  
  1404.     // slow/fast RAM
  1405.     setgadget(465, 122, 1, 12, "Mb", PLACETEXT_RIGHT);
  1406.     TE13_FastText = PrevGadPtr = (struct Gadget *) CreateGadget
  1407.     (   TEXT_KIND,
  1408.         PrevGadPtr,
  1409.         &Gadget,
  1410.         TAG_DONE
  1411.     );
  1412.     setgadget(400, 122, 64, 12, "_Slow/fast RAM:", NULL);
  1413.     ST13_Fast = PrevGadPtr = (struct Gadget *) CreateGadget
  1414.     (   STRING_KIND,
  1415.         PrevGadPtr,
  1416.         &Gadget,
  1417.         GTST_String, &(report.fastram),
  1418.         GTST_MaxChars, 4,
  1419.         GA_TabCycle, TRUE,
  1420.         GT_Underscore, '_',
  1421.         TAG_DONE
  1422.     );
  1423.  
  1424.     /* floppies */
  1425.     setgadget(400, 134, 64, 12, "_Number of floppies:", NULL);
  1426.     IN13_Floppies = PrevGadPtr = (struct Gadget *) CreateGadget
  1427.     (   INTEGER_KIND,
  1428.     PrevGadPtr,
  1429.     &Gadget,
  1430.     GTIN_Number, report.floppies,
  1431.     GA_TabCycle, TRUE,
  1432.         GT_Underscore, '_',
  1433.     TAG_DONE
  1434.     );
  1435.  
  1436.     /* hard disk controller */
  1437.     setgadget(400, 146, 128, 12, "_Hard disk controller:", NULL);
  1438.     ST13_Hard = PrevGadPtr = (struct Gadget *) CreateGadget
  1439.     (    STRING_KIND,
  1440.     PrevGadPtr,
  1441.     &Gadget,
  1442.     GTST_String, &(report.hard),
  1443.     GTST_MaxChars, MEDFIELD,
  1444.     GA_TabCycle, TRUE,
  1445.         GT_Underscore, '_',
  1446.     TAG_DONE
  1447.     );
  1448.  
  1449.     /* expansion cards */
  1450.     setgadget(400, 158, 228, 12, "_Expansion cards:", NULL);
  1451.     ST13_Expansion = PrevGadPtr = (struct Gadget *) CreateGadget
  1452.     (   STRING_KIND,
  1453.         PrevGadPtr,
  1454.         &Gadget,
  1455.     GTST_String, &(report.expansion),
  1456.     GTST_MaxChars, LONGFIELD,
  1457.     GA_TabCycle, TRUE,
  1458.         GT_Underscore, '_',
  1459.     TAG_DONE
  1460.     );
  1461.  
  1462.     /* There are 47 gadgets:
  1463.        BU99_Right      ( 1) = 1
  1464.        TE13_ModelText  ( 1) = 3
  1465.        MX13_Model      (14) =17
  1466.                             =18
  1467.        TE13_AgnusText  ( 1) =19
  1468.        MX13_Agnus      ( 5) =24
  1469.        TE13_DeniseText ( 1) =25
  1470.        MX13_Denise     ( 3) =28
  1471.        TE13_CPUText    ( 1) =29
  1472.        MX13_CPU        ( 7) =36
  1473.        TE13_ChipText   ( 1) =37
  1474.        ST13_Chip       ( 2) =39
  1475.        TE13_FastText   ( 1) =40
  1476.        ST13_Fast       ( 2) =42
  1477.        IN13_Floppies   ( 2) =44
  1478.        ST13_Hard       ( 2) =46
  1479.        ST13_Expansion  ( 2) =48 */
  1480.     drawgadgets(47);
  1481.     ActivateGadget(ST13_Chip, MainWindowPtr, NULL);
  1482.     loop();
  1483.  
  1484.     strcpy(report.chipram,   ((struct StringInfo *) ST13_Chip->SpecialInfo)->Buffer);
  1485.     strcpy(report.fastram,   ((struct StringInfo *) ST13_Fast->SpecialInfo)->Buffer);
  1486.     strcpy(report.hard,      ((struct StringInfo *) ST13_Hard->SpecialInfo)->Buffer);
  1487.     report.floppies        = ((struct StringInfo *) IN13_Floppies->SpecialInfo)->LongInt;
  1488.     if (report.floppies < 0)
  1489.     {   report.floppies = 0;
  1490.     } elif (report.floppies > 3)
  1491.     {   report.floppies = 3;
  1492.     }
  1493.     strcpy(report.expansion, ((struct StringInfo *) ST13_Expansion->SpecialInfo)->Buffer);
  1494.  
  1495.     if (!report.loaded)
  1496.     {   strcpy(report.config, "# Config: ");
  1497.         strcpy(string, ModelOptions[report.model]);
  1498.         strlwr(string);
  1499.         strcat(report.config, string);
  1500.         strcat(report.config, ",");
  1501.         strcpy(string, CPUOptions[report.cpu]);
  1502.         strlwr(string);
  1503.         strcat(report.config, string);
  1504.         strcat(report.config, ",A=");
  1505.         switch(report.agnus)
  1506.         {
  1507.         case 0:
  1508.             strcat(report.config, "AA");
  1509.         break;
  1510.         case 1:
  1511.             strcat(report.config, "ECS-pal");
  1512.         break;
  1513.         case 2:
  1514.             strcat(report.config, "ECS");
  1515.         break;
  1516.         case 3:
  1517.             strcat(report.config, "old-pal");
  1518.         break;
  1519.         default:
  1520.             strcat(report.config, "old");
  1521.         break;
  1522.         }
  1523.         strcat(report.config, ",D=");
  1524.         switch(report.denise)
  1525.         {
  1526.         case 0:
  1527.             strcat(report.config, "AA");
  1528.         break;
  1529.         case 1:
  1530.             strcat(report.config, "ECS");
  1531.         break;
  1532.         default:
  1533.             strcat(report.config, "old");
  1534.         break;
  1535.         }
  1536.         strcat(report.config, ",RAM=");
  1537.         strcat(report.config, report.chipram);
  1538.         strcat(report.config, "megC/");
  1539.         strcat(report.config, report.fastram);
  1540.         strcat(report.config, "megF,TD=");
  1541.         stcl_d(string, report.floppies);
  1542.         strcat(report.config, string);
  1543.         strcat(report.config, ",HD=");
  1544.         strcat(report.config, report.hard);
  1545.         strcat(report.config, ",");
  1546.         strcat(report.config, report.expansion);
  1547.         strcat(report.config, "\n");
  1548.         strcpy(IOBuffer, report.config);
  1549.         writeout("S:Report.config");
  1550.     }
  1551.     closewindow();
  1552. }
  1553.  
  1554. MODULE void updatereportgadgets(void)
  1555. {   // the following command is only needed when New or Open... is the
  1556.     // cause of the update.
  1557.     GT_SetGadgetAttrs
  1558.     (   ST11_Summary,
  1559.         MainWindowPtr,
  1560.         NULL,
  1561.         GTST_String, &(report.summary),
  1562.         TAG_DONE
  1563.     );
  1564.  
  1565.     if (report.type == BUG && report.severity == 3)
  1566.     {   report.severity = 0;
  1567.     }
  1568.  
  1569.     GT_SetGadgetAttrs
  1570.     (   CY11_Type,
  1571.         MainWindowPtr,
  1572.         NULL,
  1573.         GTCY_Active, report.type,
  1574.         TAG_DONE
  1575.     );
  1576.     GT_SetGadgetAttrs
  1577.     (   LV11_Subsystem,
  1578.         MainWindowPtr,
  1579.         NULL,
  1580.         GTLV_Selected, report.subsystem,
  1581.         TAG_DONE
  1582.     );
  1583.     if
  1584.     (   (!strcmp(subsystems[report.subsystem].unfriendly, "wormwars"))
  1585.      || (!strcmp(subsystems[report.subsystem].unfriendly, "report+"))
  1586.     )
  1587.     {   GT_SetGadgetAttrs
  1588.         (   TE11_EMailTo,
  1589.             MainWindowPtr,
  1590.             NULL,
  1591.             GTTX_Text, "amigansoftware@altavista.com",
  1592.             TAG_DONE
  1593.         );
  1594.     } else
  1595.     {   GT_SetGadgetAttrs
  1596.         (   TE11_EMailTo,
  1597.             MainWindowPtr,
  1598.             NULL,
  1599.             GTTX_Text, "support@haage-partner.com",
  1600.             TAG_DONE
  1601.         );
  1602.     }
  1603.  
  1604.     if (report.type == BUG)
  1605.     {   GT_SetGadgetAttrs
  1606.         (   ST11_Pathname,
  1607.             MainWindowPtr,
  1608.             NULL,
  1609.             GTST_String, report.pp,
  1610.             GA_Disabled, FALSE,
  1611.             TAG_DONE
  1612.         );
  1613.         GT_SetGadgetAttrs
  1614.         (   BU11_PathnameASL,
  1615.             MainWindowPtr,
  1616.             NULL,
  1617.             GA_Disabled, FALSE,
  1618.             TAG_DONE
  1619.         );
  1620.         GT_SetGadgetAttrs
  1621.         (   ST11_Version,
  1622.             MainWindowPtr,
  1623.             NULL,
  1624.             GTST_String, report.pv,
  1625.             GA_Disabled, FALSE,
  1626.             TAG_DONE
  1627.         );
  1628.     } else
  1629.     {   GT_SetGadgetAttrs
  1630.         (   ST11_Pathname,
  1631.             MainWindowPtr,
  1632.             NULL,
  1633.             GTST_String, report.pp,
  1634.             GA_Disabled, TRUE,
  1635.             TAG_DONE
  1636.         );
  1637.         GT_SetGadgetAttrs
  1638.         (   BU11_PathnameASL,
  1639.             MainWindowPtr,
  1640.             NULL,
  1641.             GA_Disabled, TRUE,
  1642.             TAG_DONE
  1643.         );
  1644.         GT_SetGadgetAttrs
  1645.         (   ST11_Version,
  1646.             MainWindowPtr,
  1647.             NULL,
  1648.             GTST_String, report.pv,
  1649.             GA_Disabled, TRUE,
  1650.             TAG_DONE
  1651.         );
  1652.     }
  1653.     if (report.type == COM)
  1654.     {   GT_SetGadgetAttrs
  1655.         (   LV11_Subsystem,
  1656.             MainWindowPtr,
  1657.             NULL,
  1658.             GA_Disabled, TRUE,
  1659.             TAG_DONE
  1660.         );
  1661.         GT_SetGadgetAttrs
  1662.         (   ST11_3rdName,
  1663.             MainWindowPtr,
  1664.             NULL,
  1665.             GTST_String, report.thirdname,
  1666.             GA_Disabled, FALSE,
  1667.             TAG_DONE
  1668.         );
  1669.         GT_SetGadgetAttrs
  1670.         (   ST11_3rdVer,
  1671.             MainWindowPtr,
  1672.             NULL,
  1673.             GTST_String, report.thirdver,
  1674.             GA_Disabled, FALSE,
  1675.             TAG_DONE
  1676.         );
  1677.         GT_SetGadgetAttrs
  1678.         (   ST11_3rdManuf,
  1679.             MainWindowPtr,
  1680.             NULL,
  1681.             GTST_String, report.thirdmanuf,
  1682.             GA_Disabled, FALSE,
  1683.             TAG_DONE
  1684.         );
  1685.     } else
  1686.     {   GT_SetGadgetAttrs
  1687.         (   LV11_Subsystem,
  1688.             MainWindowPtr,
  1689.             NULL,
  1690.             GA_Disabled, FALSE,
  1691.             TAG_DONE
  1692.         );
  1693.         GT_SetGadgetAttrs
  1694.         (   ST11_3rdName,
  1695.             MainWindowPtr,
  1696.             NULL,
  1697.             GTST_String, report.thirdname,
  1698.             GA_Disabled, TRUE,
  1699.             TAG_DONE
  1700.         );
  1701.         GT_SetGadgetAttrs
  1702.         (   ST11_3rdVer,
  1703.             MainWindowPtr,
  1704.             NULL,
  1705.             GTST_String, report.thirdver,
  1706.             GA_Disabled, TRUE,
  1707.             TAG_DONE
  1708.         );
  1709.         GT_SetGadgetAttrs
  1710.         (   ST11_3rdManuf,
  1711.             MainWindowPtr,
  1712.             NULL,
  1713.             GTST_String, report.thirdmanuf,
  1714.             GA_Disabled, TRUE,
  1715.             TAG_DONE
  1716.         );
  1717.     }
  1718.     if (report.type == ENH)
  1719.     {   GT_SetGadgetAttrs
  1720.         (   ST11_Debug,
  1721.             MainWindowPtr,
  1722.             NULL,
  1723.             GTST_String, report.debug,
  1724.             GA_Disabled, TRUE,
  1725.             TAG_DONE
  1726.         );
  1727.         GT_SetGadgetAttrs
  1728.         (   CY11_Severity,
  1729.             MainWindowPtr,
  1730.             NULL,
  1731.             GA_Disabled, TRUE,
  1732.             GTCY_Active, report.severity,
  1733.             TAG_DONE
  1734.         );
  1735.         GT_SetGadgetAttrs
  1736.         (   ST11_KS,
  1737.             MainWindowPtr,
  1738.             NULL,
  1739.             GTST_String, report.ks,
  1740.             GA_Disabled, TRUE,
  1741.             TAG_DONE
  1742.         );
  1743.         GT_SetGadgetAttrs
  1744.         (   ST11_WB,
  1745.             MainWindowPtr,
  1746.             NULL,
  1747.             GTST_String, report.wb,
  1748.             GA_Disabled, TRUE,
  1749.             TAG_DONE
  1750.         );
  1751.     } else
  1752.     {   GT_SetGadgetAttrs
  1753.         (   ST11_Debug,
  1754.             MainWindowPtr,
  1755.             NULL,
  1756.             GTST_String, report.debug,
  1757.             GA_Disabled, FALSE,
  1758.             TAG_DONE
  1759.         );
  1760.         GT_SetGadgetAttrs
  1761.         (   CY11_Severity,
  1762.             MainWindowPtr,
  1763.             NULL,
  1764.             GA_Disabled, FALSE,
  1765.             GTCY_Active, report.severity,
  1766.             TAG_DONE
  1767.         );
  1768.         GT_SetGadgetAttrs
  1769.         (   ST11_KS,
  1770.             MainWindowPtr,
  1771.             NULL,
  1772.             GTST_String, report.ks,
  1773.             GA_Disabled, FALSE,
  1774.             TAG_DONE
  1775.         );
  1776.         GT_SetGadgetAttrs
  1777.         (   ST11_WB,
  1778.             MainWindowPtr,
  1779.             NULL,
  1780.             GTST_String, report.wb,
  1781.             GA_Disabled, FALSE,
  1782.             TAG_DONE
  1783.         );
  1784. }   }
  1785.  
  1786. AGLOBAL void newreport(ABOOL display)
  1787. {   ULONG i;
  1788.  
  1789.     report.floppies  = 1;
  1790.     report.agnus     = 0;
  1791.     report.denise    = 0;
  1792.     report.cpu       = 2;
  1793.     report.model     = 4;
  1794.     report.type      = 0;
  1795.     report.severity  = 0;
  1796.     report.subsystem = 0;
  1797.     strcpy(report.chipram,    "2");
  1798.     strcpy(report.fastram,    "6");
  1799.     strcpy(report.hard,       "");
  1800.     strcpy(report.debug,      "");
  1801.     strcpy(report.developer,  "");
  1802.     strcpy(report.expansion,  "");
  1803.     strcpy(report.summary,    "");
  1804.     if (GetVar("Kickstart", report.ks, 6, NULL) == -1)
  1805.         report.ks[0] = 0;
  1806.     if (GetVar("Workbench", report.wb, 6, NULL) == -1)
  1807.         report.wb[0] = 0;
  1808.     strcpy(report.pv,         "");
  1809.     strcpy(report.pp,         "");
  1810.     strcpy(report.thirdname,  "");
  1811.     strcpy(report.thirdver,   "");
  1812.     strcpy(report.thirdmanuf, "");
  1813.     strcpy(report.lastname,   "");
  1814.     strcpy(report.firstname,  "");
  1815.     strcpy(report.company,    "");
  1816.     strcpy(report.phone,      "");
  1817.     strcpy(report.email,      "");
  1818.     strcpy(report.refer,      "");
  1819.     strcpy(report.referid,    "");
  1820.     strcpy(report.path,       "");
  1821.     strcpy(report.config,     "");
  1822.     strcpy(report.output,     "");
  1823.     for (i = 0; i <= 5; i++)
  1824.     {   report.textfield[i][0] = 0;
  1825.     }
  1826.     report.loaded = FALSE;
  1827.  
  1828.     /* Quicker than strcpy(report.foo, ""); is report.foo[0] = 0;
  1829.  
  1830.     Consider linking bug report generator with ID database to
  1831.     automatically generate the list of expansion cards. */
  1832.  
  1833.     if (display)
  1834.     {   updatereportgadgets();
  1835. }   }
  1836.  
  1837. AGLOBAL void openreport(void)
  1838. {   if (asl())
  1839.     {   strcpy(report.output, aslresult);
  1840.         loadreport();
  1841.         updatereportgadgets();
  1842. }   }
  1843.  
  1844. AGLOBAL void loadreport(void)
  1845. {   ULONG i;
  1846.  
  1847.     /* parse() returns when it has moved along and found the specified
  1848.        `ending string'. The contents, since last parse(), before the
  1849.        `ending string' are returned in string. */
  1850.  
  1851.     if (readin(report.output))
  1852.     {   report.loaded = TRUE;
  1853.  
  1854.         offset = 0;
  1855.         parse("# Subject: ");           // skip '# Subject: '
  1856.         parse("\n# Type: ");            // goto end of '\n# Type: '
  1857.         strcpy(report.summary, string);
  1858.         parse("\n# ");
  1859.         if (!strcmp(string, "bug"))
  1860.         {   report.type = BUG;
  1861.         } elif (!strcmp(string, "compat"))
  1862.         {   report.type = COM;
  1863.         } elif (!strcmp(string, "enhancement"))
  1864.         {   report.type = ENH;
  1865.         }
  1866.         if (report.type != COM)
  1867.         {   parse("Subsystem: ");
  1868.             parse("\n");
  1869.             for (i = 0; i <= SUBSYSTEMS; i++)
  1870.             {   if (!strcmp(string, subsystems[i].unfriendly))
  1871.                 {   report.subsystem = i;
  1872.                     break;
  1873.         }   }   }
  1874.         else
  1875.         {   parse("ProductName: ");
  1876.             parse(" (vers=");
  1877.             strcpy(report.thirdname,  string);
  1878.             parse(")\n# ProductInfo: :");
  1879.             strcpy(report.thirdver,   string);
  1880.             parse(":\n");
  1881.             strcpy(report.thirdmanuf, string);
  1882.         }
  1883.         parse("# Severity: ");
  1884.         parse("\n# ");
  1885.         if (!strcmp(string, "a"))
  1886.         {   report.severity = 0;
  1887.         } elif (!strcmp(string, "b"))
  1888.         {   report.severity = 1;
  1889.         } elif (!strcmp(string, "c"))
  1890.         {   report.severity = 2;
  1891.         } elif (!strcmp(string, "ok"))
  1892.         {   report.severity = 3;
  1893.         } elif (!strcmp(string, "e"))
  1894.         {   report.type     = ENH;
  1895.         }
  1896.  
  1897.         if (report.type != ENH)
  1898.         {   parse("Release: KS=");
  1899.             parse(",WB=");
  1900.             strcpy(report.ks, string);
  1901.             if (report.type == BUG)
  1902.             {   parse(",Program=");
  1903.                 strcpy(report.wb, string);
  1904.                 parse("\n");
  1905.                 strcpy(report.pv, string);
  1906.             } else
  1907.             {   // assert(report.type == COM);
  1908.                 parse("\n");
  1909.                 strcpy(report.wb, string);
  1910.                 report.pv[0] = 0;
  1911.             }
  1912.         } else report.pv[0] = 0;
  1913.         parse("# Date: ");
  1914.  
  1915.         // now sender fields
  1916.         parse("# Refer: ");
  1917.         parse(",");
  1918.         strcpy(report.lastname, string);
  1919.         parse(" (");
  1920.         strcpy(report.firstname, string);
  1921.         parse(" ,phone ");
  1922.         strcpy(report.company, string);
  1923.         parse(")\n# Path: ");
  1924.         strcpy(report.phone, string);
  1925.         parse("\n# ReferID: ");
  1926.         strcpy(report.email, string);
  1927.         parse("\n");
  1928.         strcpy(report.developer, string);
  1929.  
  1930.         // now config fields
  1931.         parse("# Config: ");
  1932.     parse(",");
  1933.     report.model = 4;
  1934.     for (i = 0; i <= MODELS; i++)
  1935.     {   if (!stricmp(string, ModelOptions[i]))
  1936.         {   report.model = i;
  1937.                 break; // for speed
  1938.     }   }
  1939.         parse(",A=");
  1940.     report.cpu = 1;
  1941.     for (i = 0; i <= CPUS; i++)
  1942.     {   if (!stricmp(string, CPUOptions[i]))
  1943.         {   report.cpu = i;
  1944.                 break; // for speed
  1945.         }   }
  1946.  
  1947.     parse(",D=");
  1948.     if (!stricmp(string, "AA"))
  1949.         report.agnus = 0;
  1950.     elif (!stricmp(string, "ECS-pal"))
  1951.         report.agnus = 1;
  1952.     elif (!stricmp(string, "ECS"))
  1953.         report.agnus = 2;
  1954.     elif (!stricmp(string, "old-pal"))
  1955.         report.agnus = 3;
  1956.     else /* if (!stricmp(string, "old")) */
  1957.         report.agnus = 4;
  1958.  
  1959.     parse(",RAM=");
  1960.     if (!stricmp(string, "AA"))
  1961.         report.denise = 0;
  1962.     elif (!stricmp(string, "ECS"))
  1963.         report.denise = 1;
  1964.     else /* if (!stricmp(string, "old")) */
  1965.         report.denise = 2;
  1966.  
  1967.     parse("megC/");
  1968.     strcpy(report.chipram, string);
  1969.  
  1970.     parse("megF,TD=");
  1971.     strcpy(report.fastram, string);
  1972.  
  1973.     parse(",HD=");
  1974.     report.floppies = atol(string);
  1975.  
  1976.     parse(",");
  1977.     strcpy(report.hard, string);
  1978.  
  1979.     parse("\n");
  1980.         strcpy(report.expansion, string);
  1981.  
  1982.         report.pp[0] = 0;
  1983.  
  1984.         if (report.type == BUG)
  1985.         {   parse("### BRIEF BUG DESCRIPTION:\n");
  1986.             parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  1987.             strcpy(report.textfield[0], string);     // bug description
  1988.             parse("\n### ALSO RUNNING:\n");
  1989.             strcpy(report.textfield[1], string);     // bug procedure
  1990.             parse("\n### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS "
  1991.                   "OR HARDWARE, EXPLAIN:\n");
  1992.             strcpy(report.debug, string);            // also running
  1993.             parse("\n### RELATED PROBLEMS:\n");
  1994.             strcpy(report.textfield[2], string);     // explain differently
  1995.             parsetoend();
  1996.             strcpy(report.textfield[3], string);     // related problems
  1997.         } elif (report.type == COM)
  1998.         {   if (report.severity != 3)
  1999.             {   parse("### BRIEF BUG DESCRIPTION:\n");
  2000.                 parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  2001.                 strcpy(report.textfield[0], string); // bug description
  2002.                 parse("\n### ALSO RUNNING:\n");
  2003.                 strcpy(report.textfield[1], string); // bug procedure
  2004.                 parse("\n### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS "
  2005.                       "OR HARDWARE, EXPLAIN:\n");
  2006.                 strcpy(report.debug, string);        // also running
  2007.                 parse("\n### WHAT DEVELOPER IS DOING IN THAT AREA OF SW "
  2008.                       "OR HW:\n");
  2009.                 strcpy(report.textfield[2], string); // explain differently
  2010.                 parse("\n### RELATED PROBLEMS:\n");
  2011.                 strcpy(report.textfield[3], string); // what doing?
  2012.                 parsetoend();
  2013.                 strcpy(report.textfield[4], string); // related problems
  2014.             } else
  2015.             {   parse("### BRIEF BUG DESCRIPTION:\n");
  2016.                 parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  2017.                 strcpy(report.textfield[0], string); // bug description
  2018.                 parse("\n### WHAT DEVELOPER IS DOING IN THAT AREA OF SW "
  2019.                       "OR HW:\n");
  2020.                 strcpy(report.textfield[1], string); // explain differently
  2021.                 parse("\n### RELATED PROBLEMS:\n");
  2022.                 strcpy(report.textfield[2], string); // what doing?
  2023.                 parsetoend();
  2024.                 strcpy(report.textfield[3], string); // related problems
  2025.         }   }
  2026.         else
  2027.         {   // assert(report.type == ENH);
  2028.             parse("### ENHANCEMENT REQUEST:\n");
  2029.             parsetoend();
  2030.             strcpy(report.textfield[0], string);
  2031.         }
  2032.         updatereportgadgets();
  2033. }   }
  2034.  
  2035. /*          # Subject: <subject><LF>
  2036.             # Type: bug|compat|enhancement<LF>
  2037. BUG,ENH     # Subsystem: <subsystem><LF>
  2038. COM         # ProductName: <name> (vers=<version>)
  2039. COM         # ProductInfo: :<manufacturer>:
  2040.             # Severity: a|b|c|ok|e
  2041. BUG         # Release: KS=<version>,WB=<version>,Program=<version>
  2042. COM         # Release: KS=<version>,WB=<version>
  2043.             # Date: <weekday> dd-Mon-yy hh:mm:ss
  2044.             # Refer: <refer>
  2045.             # Path: <path>
  2046.             # ReferID: <referid>
  2047.             # Config: <config>
  2048. BUG,COMa-c  ### BRIEF BUG DESCRIPTION:
  2049. BUG,COMa-c  ### BUG GENERATION PROCEDURE OR EXAMPLE:
  2050. BUG,COM     ### ALSO RUNNING:
  2051.             <debug>
  2052. BUG,COM     ### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS OR HARDWARE,
  2053.             EXPLAIN:
  2054. COMa-c        ### WHAT DEVELOPER IS DOING IN THAT AREA OF SW OR HW:    
  2055. BUG,COMa-c  ### RELATED PROBLEMS:
  2056. ENH         ### ENHANCEMENT REQUEST: */
  2057.  
  2058.